/**
 * @author Sebastian
 * @version 2.0
 * @date 2024/5/22 20:42
 */
// 合并两个有序数组，空间复杂度O（1）
    // 合并K个有序数组，合并K个有序链表
    // 双指针倒序
public class Solution88 {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 两个指针分别初始化在数组的末尾
        int i = m - 1, j = n - 1;
        // 类似于拉锁
        int p = nums1.length - 1;
        // 从后向前生成结果数组，类似合并两个有序链表的逻辑
        while (i >= 0 && j >= 0) {
            if (nums1[i] > nums2[j]) {
                nums1[p] = nums1[i];
                i--;
            } else {
                nums1[p] = nums2[j];
                j--;
            }
            p--;
        }
        while (j >= 0) {
            nums1[p] = nums2[j];
            j--;
            p--;
        }
    }
}
